package Servlets;

import Entidades.Usuario;
import Otros.FormatoCadenas;
import iBatis.Persistencia;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 *  LuxarJSP
 *      - Javier Ruiz Hidalgo
 *      - Miguel Alejandro Esteban Ordoñez
 */

/**
 *  Descripción de la Clase:
 *      - Servlet que trata la edición de la Firma del Usuario
 */

@WebServlet(name="ServletNuevaFirma", urlPatterns={"/ServletNuevaFirma"})
public class ServletNuevaFirma extends HttpServlet {
   
    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException, SQLException, FileUploadException, Exception {
        HttpSession session = request.getSession(false);
        if (session != null) {
            //Empezamos leyendo todos los parametros enviados por request debido a la encriptacion multipart/form-data
            FileItemFactory factory = new DiskFileItemFactory();
            ServletFileUpload upload = new ServletFileUpload(factory);
            List items = upload.parseRequest(request);
            String imagen = null;

            for (Object item : items) {
                FileItem uploaded = (FileItem) item;
                if (!uploaded.isFormField()) {
                    if (uploaded.getName() != null && soloImagenes(uploaded.getContentType())) {
                        String ruta = request.getRealPath("/firma") + "/";
                        File fileServer = new File(ruta + new Date().getTime() + uploaded.getName());
                        uploaded.write(fileServer);
                        imagen = fileServer.getName();
                    }
                } else {
                    String name = uploaded.getFieldName();
                    String value = uploaded.getString();
                    session.setAttribute(name, value);
                }
            }

            //Si se pulsa el boton Añadir...
            if (session.getAttribute("subir") != null) {
                //Añadimos la imagen a la lista de imagenes subidas
                if (imagen != null) {
                    if (session.getAttribute("archivos") != null) {
                        String cad = (String) session.getAttribute("archivos");
                        session.setAttribute("archivos", cad + ";firma/" + imagen);
                    } else {
                        session.setAttribute("archivos", "firma/" + imagen);
                    }
                }
                //Para que el usuario no pierda lo escrito en el campo del mensaje, lo almacenamos temporalmente
                if (session.getAttribute("mensaje") != null) {
                    session.setAttribute("recuperacionMensaje", session.getAttribute("mensaje"));
                }

                //Borramos las Cookies usadas
                session.removeAttribute("subir");

                //Volvemos a la creación de la Firma
                String url = "/nuevaFirma.jsp";
                ServletContext sc = getServletContext();
                RequestDispatcher rd = sc.getRequestDispatcher(url);
                rd.forward(request, response);
            }

            //Si se pulsa el boton Borrar...
            if (session.getAttribute("borrar") != null) {
                //Comprobamos que hay fotos subidas
                if(session.getAttribute("archivos") != null){
                    String [] archivos = ((String)session.getAttribute("archivos")).split(";");

                    //Borramos las imagenes
                    if(archivos != null){
                        for(String a: archivos){
                            String ruta = request.getRealPath("/");
                            this.eliminaImagen(ruta + a);
                        }
                    }
                }

                //Borramos el atributo archivos y los otros no necesarios
                session.removeAttribute("mensaje");
                session.removeAttribute("archivos");
                session.removeAttribute("borrar");

                //Volvemos a la creación de la Firma
                String url = "/nuevaFirma.jsp";
                ServletContext sc = getServletContext();
                RequestDispatcher rd = sc.getRequestDispatcher(url);
                rd.forward(request, response);
            }

            //Si se pulsa el boton Finalizar...
            if (session.getAttribute("finalizar") != null) {
                //Comprobamos que la firma no este vacia
                if (session.getAttribute("mensaje").equals("")){
                    session.setAttribute("errorMensaje", "Mensaje Vacio");
                    //Volvemos a la creación del mensaje
                    String url = "/nuevaFirma.jsp";
                    ServletContext sc = getServletContext();
                    RequestDispatcher rd = sc.getRequestDispatcher(url);
                    rd.forward(request, response);
                }
                else {
                    //Consultamos si hay una firma anterior
                    String firmaAntigua = Persistencia.obtieneFirma((String)session.getAttribute("usuarioIdentificado"));

                    //Si la hay, eliminamos todas las imagenes vinculadas a la firma anterior
                    if(firmaAntigua != null){
                        List<String> imagenes = FormatoCadenas.extraeImagenes(firmaAntigua);

                        for(String s: imagenes){
                            eliminaImagen(request.getRealPath("/") + s);
                        }
                    }

                    //Despues, empezamos a tratar la nueva
                    //Instanciamos un usuario
                    Usuario usuario = new Usuario();
                    usuario.setFirma((String)session.getAttribute("mensaje"));
                    usuario.setUsuario((String)session.getAttribute("usuarioIdentificado"));

                    //Actualizamos la BD
                    Persistencia.actualizaFirma(usuario);

                    //Eliminamos del servidor las imagenes no insertadas en la firma
                    if(session.getAttribute("archivos") != null){
                        String [] archivos = ((String)session.getAttribute("archivos")).split(";");
                        String m = (String)session.getAttribute("mensaje");
                        for (String a : archivos) {
                            if (m.indexOf(a) == -1) {
                                eliminaImagen(request.getRealPath("/") + a);
                            }
                        }
                    }

                    //Eliminamos los atributos no necesarios
                    session.removeAttribute("mensaje");
                    session.removeAttribute("finalizar");
                    session.removeAttribute("archivos");

                    //Redireccionamos a la página principal
                    String url = "/index.jsp";
                    ServletContext sc = getServletContext();
                    RequestDispatcher rd = sc.getRequestDispatcher(url);
                    rd.forward(request, response);
                }
            }
        }
    }

    //Función que comprueba el formato de un archivo
    private boolean soloImagenes(String tipo) {
        boolean confirm = false;

        if (tipo.equals("image/gif") || tipo.equals("image/jpeg") || tipo.equals("image/pjpeg")) {
            confirm = true;
        }

        return confirm;
    }

    //Funcion privada que elimina una imagen
    private void eliminaImagen(String ruta){
        File file = new File(ruta);
        file.delete();
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (SQLException ex) {
            Logger.getLogger(ServletNuevaFirma.class.getName()).log(Level.SEVERE, null, ex);
        } catch (FileUploadException ex) {
            Logger.getLogger(ServletNuevaFirma.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(ServletNuevaFirma.class.getName()).log(Level.SEVERE, null, ex);
        }
    } 

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (SQLException ex) {
            Logger.getLogger(ServletNuevaFirma.class.getName()).log(Level.SEVERE, null, ex);
        } catch (FileUploadException ex) {
            Logger.getLogger(ServletNuevaFirma.class.getName()).log(Level.SEVERE, null, ex);
        } catch (Exception ex) {
            Logger.getLogger(ServletNuevaFirma.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}
